//
//  JGGamepadEvent.h
//  JGGameController
//
//  Created by jagger.tu on 2024/12/30.
//

#import <Foundation/Foundation.h>
#import <JGVividEngine/JGControlEvent.h>

#ifndef __JG_GAME_PAD_DEFAULT__
#define __JG_GAME_PAD_DEFAULT__

#define GP_A_FLAG     0x1000 // F0 00
#define GP_B_FLAG     0x2000
#define GP_X_FLAG     0x4000
#define GP_Y_FLAG     0x8000

#define GP_UP_FLAG    0x0001 // 00 0F
#define GP_DOWN_FLAG  0x0002
#define GP_LEFT_FLAG  0x0004
#define GP_RIGHT_FLAG 0x0008

#define GP_LB_FLAG    0x0100 // 0F 00
#define GP_RB_FLAG    0x0200

#define GP_PLAY_FLAG  0x0010 // 00 F0
#define GP_BACK_FLAG  0x0020

#define GP_LS_CLK_FLAG  0x0040 // 00 F0
#define GP_RS_CLK_FLAG  0x0080

#define GP_SPECIAL_FLAG 0x0400 // 0F 00

#define GP_LT_FLAG     100001 //
#define GP_RT_FLAG     100002

#define GP_EMULATING_SELECT     0x1 // 00 0F
#define GP_EMULATING_SPECIAL    0x2

#define GP_MC_HEADER_A 0x0000000D
#define GP_MC_HEADER_B 0x001A
#define GP_MC_TAIL_A 0x0000009C
#define GP_MC_TAIL_B 0x0055

#endif

typedef enum {
    GP_RELEASED,
    GP_PRESSED
} VRVIUtnEvent;

NS_ASSUME_NONNULL_BEGIN

/// 建议调用接口去更新对应的值,同时如果是事件单独使用,应该保存一个 JGGamepadEvent 记录状态,每次发送事件时调用`copy` 对象去发送
/// 这样不用每次都设置值,只需更新对应状态即可.
/// 注意:这个事件为同步手柄状态,其他没更新的状态,也需要有值.
/// 游戏手柄事件
@interface JGGamepadEvent : JGControlEvent
/// 手柄名称
@property (nonatomic, strong) NSString *name;
/// 手柄数据,总的手柄数目,标识是否多手柄模式
@property (nonatomic, assign) NSInteger gamepadCount;
/// 手柄云端插槽下标,1,2,3,4
@property (nonatomic, assign) uint16_t activeGamepadMask;
/// 无需处理  -- 自动生成
@property (nonatomic, assign) uint16_t midB;
/// 手柄的按键状态
@property (nonatomic, assign) uint16_t buttonFlag;
/// 左触发器
@property (nonatomic, assign) uint16_t leftTrigger;
/// 右触发器
@property (nonatomic, assign) uint16_t rightTrigger;
/// 左摇杆x值
@property (nonatomic, assign) uint16_t leftStickX;
/// 左摇杆y值
@property (nonatomic, assign) uint16_t leftStickY;
/// 右摇杆x值
@property (nonatomic, assign) uint16_t rightStickX;
/// 右摇杆y值
@property (nonatomic, assign) uint16_t rightStickY;
/// 无需处理  -- 自动生成
@property (nonatomic, assign) uint16_t tailA;
/// 无需处理  -- 自动生成
@property (nonatomic, assign) uint16_t tailB;
/// 无需处理  -- 自动生成
@property (nonatomic, assign) uint16_t headA;
/// 无需处理  -- 自动生成
@property (nonatomic, assign) uint16_t headB;
/// 无需处理  -- 自动生成
@property (nonatomic, assign) uint64_t ts;

- (instancetype)copy;
/// 更新按钮状态值
- (void)updateBtnWithFlag:(uint16_t)flag isPressed:(BOOL)isPressed;
/// 更新左摇杆
- (void)updateLeftStickX:(uint16_t)x Y:(uint16_t)y;
/// 更新右摇杆
- (void)updateRightStickX:(uint16_t)x Y:(uint16_t)y;
/// 更新TG
- (void)updateTriggerWithLeft:(uint8_t)left right:(uint8_t)right;
/// 更新左边TG
- (void)updateTriggerWithLeft:(uint8_t)left;
/// 更新右边TG
- (void)updateTriggerWithRight:(uint8_t)right;

@end

NS_ASSUME_NONNULL_END
